/// 表单验证工具类
class Validators {
  /// 验证是否为空
  static String? validateRequired(String? value, String fieldName) {
    if (value == null || value.trim().isEmpty) {
      return '$fieldName不能为空';
    }
    return null;
  }

  /// 验证字符串长度
  static String? validateLength(String? value, String fieldName, int minLength, int maxLength) {
    if (value == null) return null;
    
    if (value.length < minLength) {
      return '$fieldName至少$minLength个字符';
    }
    
    if (value.length > maxLength) {
      return '$fieldName不能超过$maxLength个字符';
    }
    
    return null;
  }

  /// 验证邮箱格式
  static String? validateEmail(String? value) {
    if (value == null || value.isEmpty) {
      return null; // 邮箱可选
    }
    
    final emailRegex = RegExp(r'^[^@]+@[^@]+\.[^@]+$');
    if (!emailRegex.hasMatch(value)) {
      return '邮箱格式不正确';
    }
    
    return null;
  }

  /// 验证手机号格式
  static String? validatePhone(String? value) {
    if (value == null || value.isEmpty) {
      return null; // 手机号可选
    }
    
    final phoneRegex = RegExp(r'^\d{11}$');
    if (!phoneRegex.hasMatch(value)) {
      return '手机号必须是11位数字';
    }
    
    return null;
  }

  /// 验证数字格式
  static String? validateNumber(String? value, String fieldName) {
    if (value == null || value.isEmpty) {
      return '$fieldName不能为空';
    }
    
    final number = double.tryParse(value);
    if (number == null) {
      return '$fieldName必须是数字';
    }
    
    return null;
  }

  /// 验证数字范围
  static String? validateNumberRange(String? value, String fieldName, double min, double max) {
    final numberError = validateNumber(value, fieldName);
    if (numberError != null) {
      return numberError;
    }
    
    final number = double.parse(value!);
    if (number < min) {
      return '$fieldName不能小于$min';
    }
    
    if (number > max) {
      return '$fieldName不能大于$max';
    }
    
    return null;
  }

  /// 验证整数格式
  static String? validateInteger(String? value, String fieldName) {
    if (value == null || value.isEmpty) {
      return '$fieldName不能为空';
    }
    
    final integer = int.tryParse(value);
    if (integer == null) {
      return '$fieldName必须是整数';
    }
    
    return null;
  }

  /// 验证整数范围
  static String? validateIntegerRange(String? value, String fieldName, int min, int max) {
    final integerError = validateInteger(value, fieldName);
    if (integerError != null) {
      return integerError;
    }
    
    final integer = int.parse(value!);
    if (integer < min) {
      return '$fieldName不能小于$min';
    }
    
    if (integer > max) {
      return '$fieldName不能大于$max';
    }
    
    return null;
  }

  /// 验证日期格式
  static String? validateDate(String? value, String fieldName) {
    if (value == null || value.isEmpty) {
      return '$fieldName不能为空';
    }
    
    try {
      DateTime.parse(value);
      return null;
    } catch (e) {
      return '$fieldName格式不正确';
    }
  }

  /// 验证用户名格式
  static String? validateUsername(String? value) {
    if (value == null || value.isEmpty) {
      return '用户名不能为空';
    }
    
    if (value.length < 3) {
      return '用户名至少3个字符';
    }
    
    if (value.length > 50) {
      return '用户名不能超过50个字符';
    }
    
    // 只允许字母、数字、下划线
    final usernameRegex = RegExp(r'^[a-zA-Z0-9_]+$');
    if (!usernameRegex.hasMatch(value)) {
      return '用户名只能包含字母、数字和下划线';
    }
    
    return null;
  }

  /// 验证密码强度
  static String? validatePassword(String? value) {
    if (value == null || value.isEmpty) {
      return '密码不能为空';
    }
    
    if (value.length < 6) {
      return '密码至少6个字符';
    }
    
    if (value.length > 20) {
      return '密码不能超过20个字符';
    }
    
    return null;
  }

  /// 验证确认密码
  static String? validateConfirmPassword(String? value, String password) {
    if (value == null || value.isEmpty) {
      return '确认密码不能为空';
    }
    
    if (value != password) {
      return '两次输入的密码不一致';
    }
    
    return null;
  }

  /// 验证URL格式
  static String? validateUrl(String? value) {
    if (value == null || value.isEmpty) {
      return null; // URL可选
    }
    
    try {
      Uri.parse(value);
      return null;
    } catch (e) {
      return 'URL格式不正确';
    }
  }

  /// 验证身份证号
  static String? validateIdCard(String? value) {
    if (value == null || value.isEmpty) {
      return null; // 身份证号可选
    }
    
    // 简单的身份证号验证（18位）
    final idCardRegex = RegExp(r'^\d{17}[\dXx]$');
    if (!idCardRegex.hasMatch(value)) {
      return '身份证号格式不正确';
    }
    
    return null;
  }

  /// 验证邮政编码
  static String? validatePostalCode(String? value) {
    if (value == null || value.isEmpty) {
      return null; // 邮政编码可选
    }
    
    final postalCodeRegex = RegExp(r'^\d{6}$');
    if (!postalCodeRegex.hasMatch(value)) {
      return '邮政编码必须是6位数字';
    }
    
    return null;
  }

  /// 组合验证
  static String? validateCombined(List<String? Function()> validators) {
    for (final validator in validators) {
      final error = validator();
      if (error != null) {
        return error;
      }
    }
    return null;
  }
} 